/* 2025/5/6
总线：通过 bus_register 注册总线，并定义了匹配函数 HaJbus_match。
设备：通过 device_register 注册设备，并将设备关联到总线。
驱动：通过 driver_register 注册驱动，并定义了 probe 和 remove 函数。
匹配机制：设备名和驱动名一致时，驱动的 probe 函数会被调用。
*/


/* 定义总线 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>

#if 10
// 定义总线匹配函数
static int HaJbus_match(struct device *dev, struct device_driver *drv)
{
	int ret  ;
	printk("%s %s: dev->kobj.name=%s drv->name=%s\n",__FILE__,__func__ ,dev->kobj.name,drv->name );
	return 1 ; //挂载在HajBus总线上的设备和驱动自动互相匹配成功,留待在driver的probe函数里判断匹配.
	//dump_stack() ;
    // 如果设备名和驱动名匹配，则返回1
    if (!strncmp(drv->name, dev->kobj.name, strlen(drv->name)))
    {
        printk("%s %s:match ok\n",(char*)0/*__FILE__*/,__func__ );
		ret = 1 ;
    }
    else
    {
        printk("%s %s:match failed\n",__FILE__,__func__ );
		ret = 0 ;
    }
	printk("%s %s: return %d\n",__FILE__,__func__ , ret ) ;
	return ret ;
}
#endif 
// 定义总线对象
struct bus_type HaJbus = {
    .name = "HaJbus",  // 总线名字
    .match = HaJbus_match,  // 匹配函数
};
EXPORT_SYMBOL_GPL( HaJbus ) ;

// 模块加载函数：注册总线
static int __init HaJbus_init(void)
{
    int ret;
	printk("%s %s\n",__FILE__,__func__);
    ret = bus_register(&HaJbus);
    if (ret != 0)
    {
        printk("%s %s:bus_register error\n",__FILE__,__func__);
        return ret;
    }
    return 0;
}

// 模块卸载函数：注销总线
static void __exit HaJbus_exit(void)
{
    bus_unregister(&HaJbus);
}

module_init(HaJbus_init);
module_exit(HaJbus_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("HanJ");
MODULE_DESCRIPTION("A simple Linux bus example");

